package servlets.site;

import gestionnaires.GestionnaireAdresse;
import gestionnaires.GestionnairePanier;
import gestionnaires.GestionnaireAchat;
import gestionnaires.GestionnaireUtilisateurs;
import utilisateurs.modeles.Achat;
import utilisateurs.modeles.Panier;
import utilisateurs.modeles.Utilisateur;
import helpers.ServletHelper;
import java.io.IOException;
import java.util.Date;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/*
 * Cette servlet contient les traitements relatifs au passage d'une commande
 */
@WebServlet(name = "CheckoutServlet", urlPatterns = {"/CheckoutServlet"})
public class CheckoutServlet extends HttpServlet {

    //////////////////////////// GESTIONNAIRES //////////////////////////////
    @EJB
    private GestionnaireAchat checkoutFacade;
    @EJB
    private GestionnaireUtilisateurs userFacade;
    @EJB
    private GestionnaireAdresse addressFacade;
    @EJB
    private GestionnairePanier cartFacade;
    //////////////////////////////////////////////////////////////////////////

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession s = request.getSession();
        Utilisateur u = (Utilisateur) s.getAttribute("utilisateur");
        String forwardTo = "";

        // Si l'utilisateur a possède un panier non vide, on passe la commande
        if (u != null && !u.getPanier().getLigneDePanier().isEmpty()) {
            // on récupère les parametres
            int etap = ServletHelper.getIntegerValue(request.getParameter("etap"));
            int id = ServletHelper.getIntegerValue(request.getParameter("address_id"));
            Achat c = (Achat) s.getAttribute("checkout");

            // on applique des traitements différents en fonction du parametre "etape"
            switch (etap) {
                // Etape d'enregistrement de l'adresse de facturation
                case 2:
                    if (c != null && id > 0) {
                        c.setBilling(addressFacade.find(id));
                        checkoutFacade.edit(c);
                        s.setAttribute("checkout", c);
                    } else {
                        forwardTo = "?page=checkout";
                    }
                    break;
                // Etape d'enregistrement de l'adresse de livraison
                case 3:
                    if (c != null && id > 0) {
                        c.setShipping(addressFacade.find(id));
                        checkoutFacade.edit(c);
                        s.setAttribute("checkout", c);
                    } else {
                        forwardTo = "?page=checkout";
                    }
                    break;
                // On enregistre la commande et on vide la panier
                case 4:
                    if (c != null) {
                        // enregistrement de la commande
                        Panier p = u.getPanier();
                        c.setCart(p);
                        c.setDate(new Date());
                        c.setValid(true);
                        checkoutFacade.edit(c);
                        // on vide la panier
                        u.setPanier(cartFacade.create());
                        userFacade.edit(u);
                        // on retire la commande de la session et met à jour l'utilisateur en session
                        s.removeAttribute("checkout");
                        s.setAttribute("utilisateur", userFacade.find(u.getId()));
                        // on affiche la page des commandes pour montrer à l'utilisateur que celle-ci a été pris en compte
                        forwardTo = "?page=account&view=orders";
                    } else {
                        forwardTo = "?page=checkout";
                    }
                    break;
                 // S'il n'y a pas de commande, on récupère la dernière ou on en créé une nouvelle
                default:
                    if (c == null) {
                        c = checkoutFacade.getLast(u);

                        if (c == null) {
                            c = checkoutFacade.create();
                            u.getCommandes().add(c);
                            userFacade.edit(u);
                        }
                        s.setAttribute("checkout", c);
                    }
            }
        // S'il n'y a ni utilisateur, ni panier, on affiche la page d'erreur
        } else {
            forwardTo = "?page=error";
        }
        RequestDispatcher dispatcher = request.getRequestDispatcher("home.jsp" + forwardTo);
        dispatcher.forward(request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
